package clases

import mixins._
import excepciones._
import scala.collection.mutable.ArrayBuffer
import scala.util.control.Exception._
class Recepcion (cancha:ArrayBuffer[Cancha with Alquilable]) {

  //no se si Cancha tendría que ser abstracta y aca iría otra cosa

  val canchas = cancha

 
  def reservarCancha(numeroCancha: Int, cliente: Cliente, fecha: Int, horaInicio: Int, horaFin: Int) = {
    var laCancha = canchas.find(a => a.numero == numeroCancha)
    laCancha match {
      case laCancha:Cancha with clases.Alquilable  =>
      	var reservaTemporal = new Reserva(fecha, horaInicio, horaFin, cliente)
  		laCancha.reservatePara(reservaTemporal)
      case _ =>
            throw new NoReservableExcepcion("no ingreso una cancha valida")

    }
  }

  def queCanchasTienenReservasElDia(unDia: Int):ArrayBuffer[Cancha with Alquilable]= {
    var canchasConReserva = canchas.filter(a => a.tenesReservaElDia(unDia))
    return canchasConReserva
  }

  def canchaConMasReservas():Cancha with Alquilable = {
    var unaCancha = canchas.maxBy(_.reservas.size)
    return unaCancha
  }

  def reservasParaElDia(unDia:Int):ArrayBuffer[Reserva]={
    queCanchasTienenReservasElDia(unDia).map(c => c.reservas).flatten
    
  }
  
  def hayCanchaLibre(fecha:Int,horaInicio:Int,horaFin:Int):Cancha with Alquilable={
    var reservaTemporal = new Reserva(fecha,horaInicio,horaFin,new Cliente)
    var unaCancha = canchas.find(_.sePuedeReservar(reservaTemporal))
    unaCancha match{
      case unaCancha:Cancha with Alquilable => return unaCancha
      case _ => throw new NoHayCanchaLibreException{message="No hay una cancha libre en esa fecha y horario"}
    }
  }
  
  
  def calcularFacturacionTotal:Double={
    var numero:Double = 0
    canchas.foreach(a=> numero=numero+facturacionTotalReservas(a))
    return numero
  }
  
    def facturacionTotalReservas(cancha:Cancha with Alquilable):Double={
      var total: Double = 0
      cancha.reservas.foreach(reserva => total = total + cancha.tuPrecio(reserva))
      return total
    }

}